// api/extractionApi.ts

/**
 * AI 元数据提取 API 封装
 * 对应后端 endpoints/extraction.py
 */

import { initializeApiConfig } from './config';
const API_BASE = initializeApiConfig(); 

// --- 类型定义 (与后端 Pydantic 模型和响应保持一致) ---

// 对应后端的 DocumentMetadata 结构（部分简化）
export interface ExtractedDocumentMetadata {
    title: string | null;
    summary: string | null;
    keywords: string[] | null;
    document_type: string | null;
    material_id: number | null;
    is_public: boolean;
    // 后端可能返回更多字段
}

// 对应后端的 ExtractionRequest
export interface ExtractionRequestPayload {
    file_key?: string | null; // 文件存储的 key
    content?: string | null;  // 直接的文本内容
    is_public: boolean;       // 是否公开
}

// 辅助函数（假设从公共文件中引入）
interface ErrorDetail { detail: string; }
async function handleResponse<T>(response: Response): Promise<T> {
  if (!response.ok) {
    let errorDetail: ErrorDetail = { detail: '未知 API 错误' };
    try {
      errorDetail = await response.json();
    } catch (e) {
      const text = await response.text();
      errorDetail.detail = response.statusText + ': ' + text.substring(0, 100) + '...';
    }
    throw new Error(errorDetail.detail);
  }
  if (response.status !== 204 && response.headers.get('content-length') !== '0') {
      return response.json();
  }
  return {} as T;
}

// -------------------------------------------------------------------
// --- API 方法定义 ---
// -------------------------------------------------------------------

/**
 * 从文档或文本中提取元数据
 * POST /api/v1/extraction/extract_metadata
 * @param payload 包含 file_key 或 content 的请求体
 */
export const extractDocumentMetadata = async (
    payload: ExtractionRequestPayload
): Promise<ExtractedDocumentMetadata> => {
    // 确保 content/file_key 至少有一个，否则后端可能会抛出 400
    if (!payload.file_key && !payload.content) {
        throw new Error("必须提供文件键 (file_key) 或文本内容 (content) 进行提取。");
    }
    
    const response = await fetch(`${API_BASE}/extraction/extract_metadata`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(payload),
    });

    return handleResponse(response);
};